package it.bela.pgcdc.service.impl;

import java.util.List;

import it.bela.pgcdc.common.exception.ServiceException;
import it.bela.pgcdc.common.utils.Utilities;
import it.bela.pgcdc.dao.ParrocchiaDao;
import it.bela.pgcdc.domain.Parrocchia;
import it.bela.pgcdc.service.ParrocchiaService;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
@Service
@Transactional(rollbackFor = ServiceException.class)
public class ParrocchiaServiceImpl implements ParrocchiaService {
	
	private static final Logger log = Logger.getLogger(ParrocchiaServiceImpl.class);
	
	@Autowired(required = true)
	private ParrocchiaDao parrocchiaDao;
	
	private boolean hasValidKey(Parrocchia parrocchia) {
		return (parrocchia.getId() != 0);
	}

	@Override
	public List<Parrocchia> findByExample(Parrocchia parrocchia) throws ServiceException {
		
		try {
			log.debug("Start list Parrocchia");
			
			parrocchia = (Parrocchia) Utilities.setDefaultParametersSelect(parrocchia);
			
			List<Parrocchia> list = parrocchiaDao.findByExample(parrocchia);
			
			log.debug("End list Parrocchia");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample Parrocchia failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public List<Parrocchia> list() throws ServiceException {
		
		try {
			log.debug("Start list");
			
			Parrocchia parrocchia = new Parrocchia();
			
			parrocchia = (Parrocchia) Utilities.setDefaultParametersSelect(parrocchia);

			List<Parrocchia> list = parrocchiaDao.findByExample(parrocchia);
			
			log.debug("End list");
			
			return list;

		} catch (Exception e) {
			log.debug("findByExample failed" + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean delete(Parrocchia parrocchia) throws ServiceException {
		log.debug(parrocchia.getClass().toString() + " - Start delete");
		
		String message = parrocchia.getClass().toString() + " - delete Parrocchia failed.";
		try {
			if (!hasValidKey(parrocchia)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			parrocchia = (Parrocchia) parrocchiaDao.findById(parrocchia.getClass(), parrocchia.getId());
			parrocchiaDao.delete(parrocchia);
			
			log.debug(parrocchia.getClass().toString() + " - End delete Parrocchia");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}

	public boolean persist(Parrocchia parrocchia) throws ServiceException {
		log.debug(parrocchia.getClass().toString() + " - Start persist Parrocchia");
		
		String message = parrocchia.getClass().toString() + " - persist Parrocchia failed.";
		try {
			
			parrocchia = (Parrocchia) Utilities.setDefaultParametersInsert(parrocchia);
			parrocchiaDao.persist(parrocchia);
			
			log.debug(Parrocchia.class.toString() + " - End persist Parrocchia");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean save(Parrocchia parrocchia) throws ServiceException {
		log.debug(parrocchia.getClass().toString() + " - Start save Parrocchia");
		
		String message = Parrocchia.class.toString() + " - save Parrocchia failed.";
		try {
			
			parrocchia = (Parrocchia) Utilities.setDefaultParametersInsert(parrocchia);
			parrocchiaDao.save(parrocchia);
			
			log.debug(Parrocchia.class.toString() + " - End save Parrocchia");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public boolean merge(Parrocchia parrocchia) throws ServiceException {
		log.debug(Parrocchia.class.toString() + " - Start merge Parrocchia");
		
		String message = Parrocchia.class.toString() + " - merge Parrocchia failed.";
		try {
			if (!hasValidKey(parrocchia)) {
				String messageInner = message + " Oggetto senza id.";
				log.debug(messageInner);
				throw new ServiceException(messageInner);
			}
			
			parrocchia = (Parrocchia) Utilities.setDefaultParametersUpdate(parrocchia);
			parrocchiaDao.merge(parrocchia);
			
			log.debug(Parrocchia.class.toString() + " - End merge Parrocchia");
			return true;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
	
	public Parrocchia findById(Class<Parrocchia> classe, Long id)throws ServiceException {
		log.debug(Parrocchia.class.toString() + " - Start findById Parrocchia");
		
		String message = Parrocchia.class.toString() + " - findById Parrocchia failed.";
		try {
			
			Parrocchia parrocchia = (Parrocchia) parrocchiaDao.findById(classe, id);
			
			log.debug(Parrocchia.class.toString() + " - End findById Parrocchia");
			return parrocchia;
		} catch (Exception e) {
			log.debug(message + e.getMessage(), e);
			throw new ServiceException(e);
		}
	}
}
